class Car {
  constructor(color, made, model) {
    this.color = color
    this.made = made
    this.model = model
  }
}

const car1 = new Car("red", "chevrolet", "spark")
const car2 = new Car("blue", "hyundai", "tucson")

car1.doors = 2
car2.radio = true
// 手写一个 new 操作符

/*
	1. 一个继承自构造函数原型对象的新对象被创建
	2. 新创建对象的__protp__属性指向构造函数的prototype
	3. 将 this 指向新创建的对象
	4. 返回新的对象
		4.1 如果构造函数没有显式的返回值，则返回 this
		4.2 如果构造函数有显式的返回值，是基本类型 number、sring、boolean，则返回 this
		4.2 如果构造函数有显式的返回值，是对象类型，{a: 1},则返回这个对象{a: 1}
*/
Function.prototype.myApply = function(context, args){
	// 首先判断传入的 context 参数的类型
	if(typeof context === 'undefined' || context === null) {
		context = window
	}
	// 声明一个唯一的 key 键 Symbol
	const fnSymbol = Symbol()
	// 为当前的 context 添加一个新的属性 fnSymbol,属性值为调用 call 方法的函数
	context[fnSymbol] = this
	// 执行函数方法，并传入参数
	let fn = context[fnSymbol](...args)
	// 删除当前 context 中的新添加的 fnSymbol 属性
	delete context[fnSymbol]
	// 最终返回函数的执行结果 fn
	return fn
}
function Person(){
	this.name = 'zxw'
}
let ooo = Person()
console.log(typeof ooo)
function ObjectFactory(){
	// 创建一个新对象
	let o = new Object()
	// 获取参数
	const objFn = [].shift.call(arguments) // Person参数
	// 新创建对象的__proto__指向构造函数的prototype
	o.__proto__ = objFn.prototype
	// 改变 this 指向
	let resultObj = objFn.myApply(o, arguments)
	// 返回创建的对象
	console.log(typeof resultObj === 'object')
	return typeof resultObj === 'object' ? resultObj : o
}

const p = ObjectFactory(Person)
console.log(p)